问题: 类中的__init__方法有什么作用,为什么叫构造方法?

👇 点击展开/折叠 面试背诵模板(建议先背这个) `__init__` 是 Python 中的实例初始化方法,在对象创建后自动调用,负责绑定实例属性、执行数据校验和初始化逻辑。它被俗称为构造方法,但严格来说并非真正的构造器——真正的构造器是 `__new__`,负责分配内存并返回空对象。`__init__` 仅负责“装修”已分配好的空对象,必须返回 `None`。`__init__` 是实例化的入口,是面向对象编程中最常用的魔法方法。
---

名称辨析:为什么__init__会被误称为“构造方法”

在多数面向对象语言(如 Java、C++)中,构造方法(Constructor)负责分配内存和初始化数据。Python 将此两步分离:__new__ 负责分配内存,__init__ 负责初始化。由于开发者极少重写 __new__,日常编程中 __init__ 承担了构造方法的大部分视觉职责(写属性、设默认值),因此业界习惯将其称为“构造方法”或“构造函数”。

__new__ 与 __init__ 的核心职责对比

维度 __new__ __init__
本质角色 真正的构造器 初始化器
第一参数 cls(类本身) self(已分配的实例)
主要职责 分配内存,返回空实例 填充数据,绑定属性
返回值 必须返回实例(instance) 必须返回 None
执行时机 先执行 后执行
重写频率 极少(单例、不可变类型如 int 子类化) 几乎每次定义类都会重写
1
2
3
4
5
6
7
8
9
10
11
12
13
class Demo:
def __new__(cls):
print("1. 分配内存")
return super().__new__(cls)

def __init__(self):
print("2. 初始化数据")
self.value = 100

d = Demo()
# 输出顺序:
# 1. 分配内存
# 2. 初始化数据

实现细节:实例化时的参数传递机制

当调用 Student("张三", 18) 时,Python 解释器执行以下等价逻辑:

1
2
3
4
5
6
# 伪代码揭示底层调用顺序
def 实例化(cls, *args, **kwargs):
obj = cls.__new__(cls) # ① 创建空对象
if isinstance(obj, cls):
cls.__init__(obj, *args, **kwargs) # ② 初始化对象
return obj

日常开发中的核心作用(功能层面)

  1. 强制绑定实例属性:确保每个对象创建后都具备必要属性(如 self.name),避免后续访问 AttributeError。
  2. 合法性校验:在属性赋值前进行边界检查(如年龄不能为负),保证对象的不变性(Invariant)。
  3. 关联外部资源:建立数据库连接、打开文件句柄或注册回调等,让对象一出厂就处于“可用状态”。

常见陷阱与注意事项

  • 返回值限制:若在 __init__ 中 return 非 None 的值,会抛出 TypeError。它本质是变更函数,不是工厂函数。
  • 默认参数突变:避免使用 def __init__(self, items=[]),因为空列表在定义时创建,所有实例共享同一列表。正确做法为 items=None。
  • 必须调用父类初始化:若子类重写了 __init__,需要显式调用 super().__init__(),否则父类属性不会被绑定,导致对象缺少父类定义的特征。